const express = require("express");

const router = express.Router();
const jwt = require("jsonwebtoken");

const fs = require("fs");
const path = require("path");
let user_data_file_path = path.resolve(__dirname, "../static/user.json");
let user_info_file_path = path.resolve(__dirname, "../static/userinfo.json");
router.post("/login", (req, res) => {
    fs.readFile(user_data_file_path, "utf8", (err, data) => {
        if (err) {
            res.send("文件读取失败");
        }
        let obj = JSON.parse(data);
        //拿到user.json里的数据并确保是对象格式

        let results = obj.users.filter((item) => {
            return item.username == req.body.username && item.password == req.body.pw;
        });
        //对用户输入的用户名和密码进行校验，返回满足条件的数据
        if (results.length != 0) {
            //如果能拿到results证明用户名和密码都通过验证
            let id = results[0].id;
            let token = jwt.sign({ id }, "secret_key", {
                expiresIn: 10 * 60, //十分钟过期
            });
            // 对results中的用户id进行
            // 执行jwt.sign方法生成token，这个 sign 方法需要三个参数：
            // playload：签发的 token 里面要包含的一些数据。
            // secret：签发 token 用的密钥，在验证 token 的时候同样需要用到这个密钥。
            // options：一些其它的选项。
            //在这里我们对用户的id进行加密，生成token

            res.send({ suc: true, token, msg: "登录成功", status: "200" });
            // 登录成功后返回给用户一个json，其中包含了token
        } else {
            res.send({ suc: false, msg: "用户名或密码错误", status: "302" });
            // 如果用户名和密码出错就返回错误提示信息
        }
    });
});

// 因为每个接口都需要定义获取auth，那么我们可以采用中间件来进行封装
const auth = (req, res, next) => {
    let get_token = req.headers.authorization;
    //获取客户端通过header传递过来的token
    if (get_token) {
        //验证token，第一个参数是接收到的参数，第二个参数是签发token时的密钥，第三个参数是一个回调函数
        jwt.verify(get_token, "secret_key", function(err, decoded) {
            // 这个回调函数中第一个参数是错误信息，第二个参数是token解密后的值
            if (err) {
                //如果token过期则会执行err的代码块
                res.send({ suc: false, msg: "无效token" });
            } else {
                // 到这一步证明token验证成功
                console.log(decoded); //{ id: '1001', iat: 1590478848, exp: 1590479448 } 里面有我们签发token时的值id，还有发布时间和过期时间
                const { id } = decoded;
                //把id结构出来使用，我们在这里通过校验token已经知道发送请求的用户是谁了
                req.userid = id;
                // if everything is good, save to request for use in other routes
                //将解码信息储存于req中方便其他路由使用
                next();
            }
        });
    } else {
        res.send({ suc: false, msg: "无效token" });
    }
};

router.get("/islogin", auth, (req, res) => {
    if (req.userid) {
        res.send({
            suc: true,
            msg: "已登陆",
        });
    } else {
        res.send({
            suc: false,
            msg: "未登陆",
        });
    }
});
//是否登录接口

router.get("/getuserinfo", auth, (req, res) => {
    fs.readFile(user_info_file_path, "utf8", (err, data) => {
        if (err) {
            res.send("文件读取失败");
        }
        let obj = JSON.parse(data);
        //读取json文件userinfo里的用户基本信息
        let result = obj.usersinfo.filter((item) => {
            return item.id == req.userid;
        });
        //根据验证token得来的id拿到相对应的用户信息

        if (result) {
            res.send({ suc: true, userInfo: result });
            //拿到信息后把信息返回给客户端
        } else {
            res.send(false);
        }
    });
});
// 获取用户信息 使用中间件验证是否登录

module.exports = router;